#include<iostream>
#include<unistd.h>
#include<pthread.h>
#include<signal.h>
#include<cstdlib>
#include<cstring>
using namespace std;


void* handler(void* arg)
{
    pthread_t* td=static_cast<pthread_t*>(arg);
    int cnt=10;
    pthread_detach(*td);

    while(cnt)
    {
        cout<<cnt--<<" : Thread is running\n";
        sleep(1);
    }

    int *p=(int*)malloc(sizeof(int));
    *p=3;
    return (void*)p;


}

int main()
{
    pthread_t tid;
    if(pthread_create(&tid,nullptr,handler,(void*)&tid)!=0)
    {
        printf("pthread_create is failed\n");
        exit(1);
    }
    void* ret=nullptr;

    int count=5;
    
    while(count)
    {
        cout<<count--<<" : This is main thread and it is running!\n";
        sleep(1);
    }
    sleep(1);//有时间让线程分离
    if(pthread_join(tid,&ret)!=0)
    {
        printf("pthread_join is failed\n" );
        return 2;
    }
    else
    {
        printf("pthread_join is successful and returncoding is %d\n",*(int*)ret);
        return 0;

    }

    
}


















// void *thread3(void*arg)
// {
//     while(1)
//     {
//         printf("这里是线程3的执行流\n");
//         //sleep(1);
//     }
//     return nullptr;
// }

// void *thread2(void*arg)
// {
//     const char* name=(const char*)arg;
//     printf("这里是线程2的执行流\n");
//     cout<<name<<endl;
//     int*p=(int*)malloc(sizeof(int));
//     *p=2;
//     pthread_exit((void*)p);

// }

// void* thread1(void*arg)
// {
    
//     cout<<"来到线程1的函数执行流,pid: "<<getpid()<<endl;
//     sleep(1);
//     int* p=(int*)malloc(sizeof(int));
//     *p=1;
//     return (void*)p;
    

// }
// void handler(int signo)
// {
//     cout<<"捕捉到11号信号"<<endl;
// }
// int main()
// {
//     struct sigaction sig;
//     memset(&sig,0,sizeof(sig));
//     //sigaddset(&sig.sa_mask,11);

//     pthread_t tid;
//     void* ret;
//     pthread_create(&tid,nullptr,thread1,(void*)"你好啊姑娘！");
//     pthread_join(tid,&ret);
//     sleep(2);
//     printf("我已经回收了线程1，并拿到了返回值：%d\n",*(int*)ret);
//     free(ret);

//     pthread_create(&tid,nullptr,thread2,(void*)"你好啊姑娘！");
//     pthread_join(tid,&ret);
//     sleep(2);
//     printf("我已经回收了线程2，并拿到了返回值：%d\n",*(int*)ret);
//     free(ret);


//     pthread_create(&tid,nullptr,thread3,nullptr);
//     //sleep(5);
//     //signal(11,handler);
//     sig.sa_handler=handler;
//     sigaction(11,&sig,nullptr);
//     pthread_cancel(tid);
    




//     pthread_join(tid,&ret);
//     if(ret==PTHREAD_CANCELED)
//     {
//         printf("thread return, thread id %X, return code:PTHREAD_CANCELED\n", tid);
//     }
//     else
//         printf("thread return, thread id %X, return code:nullptr\n", tid);


//     free(ret);
    


//     // while(1)
//     // {
//     //     cout<<"这里是主线程,pid: "<<getpid()<<endl;
//     //     sleep(2);
//     // }

//     return 0;
// }